#include <iostream>
#include <vector>

using namespace std;

const int N = 15, M = 110, K = 1 << 10;

typedef long long LL;

int n, m; 
vector<int> head[K], state; 
    // head[i]存放下标为i的状态所能转移到的状态下标, state则存放每个合法状态
int cnt[K]; // 存放每个状态中所放的国王个数
LL f[N][M][K]; 
    // f[i][j][k]代表前i行已经放好了j个国王且当前最后一行的状态下标为k的合法方案数

bool check(int x) { // 检查该下标对应的状态中是否没有相邻的1
    return !(x & x >> 1); // Ps: 来自于抽风巨巨的优化~
                    // 这个真的很秒~ 小伙伴模拟一下就会清楚了~
}

int count(int state) { // 返回状态state中所放的国王的个数(即二进制中1的个数)
    int res = 0;
    for (int i = 0; i < n; ++ i) res += (state >> i & 1);
    return res;
}

int main() {
    cin >> n >> m; // n * n的棋盘, 要放m个国王

    /* 预处理出合法的状态过程：*/
    for (int i = 0; i < 1 << n; ++ i) // 遍历所有可能的状态
        if (check(i)) { // 如果该状态没有相邻的1
            state.push_back(i); // 则将该状态存入state
            cnt[i] = count(i); // 并记录下该状态中所放的国王数
        }

    /* 预处理出合法的状态转移过程: */
    for (int i = 0; i < state.size(); ++ i) // 遍历已经预处理出的合法状态
        for (int j = 0; j < state.size(); ++ j) { // 寻找能接在该状态后的状态(即合法的状态转移)
            int a = state[i], b = state[j]; // a, b分别为此刻遍历到的先后状态
            if ((a & b) == 0 && check(a | b)) // 如果满足合法方案的条件则说明此状态转移合法
                head[i].push_back(j); // 并且将此合法状态转移的两个状态下标存入head[]
 // ps: 此时说明下标为i的状态能接在下标为j的状态后(即下一行),则说明下标为i的状态能由下标为j的状态转移而来
 //          即将下标j存进head[i] ~
        }

    /* 状压DP过程：*/
    f[0][0][0] = 1; // 什么也不做的时候也算一种合法方案
    for (int i = 1; i <= n + 1; ++ i) 
    // 从第1行开始遍历遍历到n + 1行(是一步为了最后不用枚举答案的小优化)
        for (int j = 0; j <= m; ++ j) // 枚举能放的国王个数
            for (int a = 0; a < state.size(); ++ a) // 枚举每个状态(下标)
                for (int b : head[a]) { // 枚举此状态对应的所有合法状态转移(下标)
                    int num = cnt[state[a]]; // num为状态a所放的国王数
                    if (j >= num) // 如果国王还未被放完
                        f[i][j][a] += f[i - 1][j - num][b]; // 则继续转移
            // 此刻第i行(即最后一行)状态(下标)为a, 已经放好j个国王的方案数
            // 由 第i - 1行状态(下标)为b, 已经放好j - num个国王的方案数转移过来
            // 即 f[i][j][a] 由 f[i - 1][j - num][b] 转移而来
                }

    /*如果不枚举到n + 1行而是只刚好枚举到第n行的话就需要再进行枚举的操作: */
    // LL res = 0;
    // for (int i = 0; i < state.size(); ++ i) res += f[n][m][i];
    // cout << res << endl;

    cout << f[n + 1][m][0] << endl; 
        // 输出到n + 1行, 已经放了m个国王, 当前最后一行的状态下标为0的合法方案数
        // 即相当于刚好把m个国王放进n * n的棋盘后的方案数
        // 这样就不用像上面的把f[n][m][0 ~ state.size() - 1]都累加起来的操作了

    return 0; // 结束快乐~
}